/* Copyright (C) 2008  Romolo Camplani, Marco Fortunato, Marco Marelli, Guido Rota, Fabio A. Schreiber et al.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
package org.dei.perla.utils.logger;

import java.util.Date;


/**
 * Record inseribile nel log
 */
public class LogRecord {

	/**
	 * Enumerazione dei tipi di messaggio	 
	 */
	public enum Type {
		Error,
		Warning,
		Information,		
	};
	
	
	/**
	 * Enumerazione dei livelli di verbosità del log	 
	 */
	public enum Verbosity {
		High   (30),	// Messaggio da visualizzare solo se la verbosità e almeno High
		Medium (20),	// Messaggio da visualizzare solo se la verbosità è almeno Medium 
		Low    (10);	// Messaggio sempre visualizzato
		
		private int pVerbosityValue;
		
		private Verbosity(int parVerbosityValue) {
			this.pVerbosityValue = parVerbosityValue;
		}
		
		public boolean Show(Verbosity parMessageVerbosity) {
			return (parMessageVerbosity.pVerbosityValue <= this.pVerbosityValue);
		}
	};
	
	
	private Date      pTime;		// Data e ora associate al messaggio 
	private String    pSourceType;	// Tipo del componente che ha generato il messaggio
	private String    pSourceName;	// Nome del componente che ha generato il messaggio
	private Type      pMessageType;	// Tipo di messaggio
	private String    pMessage;		// Testo del messaggio
	private String    pDetails;		// Testo dettagliato del messaggio
	private Verbosity pVerbosity;	// Livello di verbosità associato al messaggio
	
	
	/**
	 * Costruttore
	 * @param parTime      		Data e ora associate al messaggio
	 * @param parSourceType 	Tipo del componente che ha generato il messaggio
	 * @param parSourceName 	Nome del componente che ha generato il messaggio 
	 * @param parMessageType    Tipo di messaggio
	 * @param parMessage		Testo del messaggio
	 * @param parDetails		Testo dettagliato del messaggio
	 * @param parVerbosity 		Livello di verbosità
	 */
	public LogRecord(Date parTime, String parSourceType, String parSourceName, Type parMessageType, String parMessage, String parDetails, Verbosity parVerbosity) {
		
		this.pTime        = parTime;
		this.pSourceType  = parSourceType;
		this.pSourceName  = parSourceName;
		this.pMessageType = parMessageType;
		this.pMessage     = parMessage;
		this.pDetails  	  = parDetails;
		this.pVerbosity   = parVerbosity;
	}
	
	
	/**
	 * Costruttore
	 * @param parSourceType 	Tipo del componente che ha generato il messaggio
	 * @param parSourceName 	Nome del componente che ha generato il messaggio
	 * @param parMessageType	Tipo di messaggio
	 * @param parMessage		Testo del messaggio
	 * @param parDetails		Testo dettagliato del messaggio
	 * @param parVerbosity 		Livello di verbosità
	 */
	public LogRecord(String parSourceType, String parSourceName, Type parMessageType, String parMessage, String parDetails, Verbosity parVerbosity) 
	{
		this(new Date(), parSourceType, parSourceName, parMessageType, parMessage, parDetails, parVerbosity);
	}
	
	
	/**
	 * Restituisce la data e ora associate al messaggio
	 */
	public Date getTime() {
		return this.pTime;		
	}

	
	/**
	 * Restituisce il tipo del componente che ha generato il messaggio
	 */
	public String getSourceType() {
		return this.pSourceType;
	}
	
	
	/**
	 * Restituisce il nome del componente che ha generato il messaggio
	 */
	public String getSourceName() {
		return this.pSourceName;
	}
	
	
	/**
	 * Restituisce il tipo di messaggio
	 */
	public Type getMessageType() {
		return this.pMessageType;
	}
	
	
	/**
	 * Restituisce il testo del messaggio
	 */
	public String getMessage() {
		return this.pMessage;
	}
	
	
	/**
	 * Restituisce il testo dettagliato del messaggio
	 */
	public String getDetails() {
		return this.pDetails;
	}
	
	
	/**
	 * Restituisce il livello di verbosità associato al messaggio
	 */
	public Verbosity getVerbosity() {
		return this.pVerbosity;
	}

	
	/**
	 * Restituisce una stringa che descrive il messaggio di Log
	 */
	public String toString() {
		
		String tString = "";
		
		
		tString += this.pTime.toString() + "  ";
		switch(this.pMessageType) {
			case Error:			tString += "ERR"; break;
			case Warning:		tString += "wrn"; break;
			case Information:	tString += "   "; break;
		}
		tString += "  ";
		tString += this.pSourceType + " [" + this.pSourceName + "] ";
		tString += "-> ";
		tString += this.pMessage;
		if(this.pDetails != "")
			tString += " {" + this.pDetails + "}";
		
		return tString;
	}
}
